package sistema
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.Locale
import org.springframework.dao.DataIntegrityViolationException

class ProdutoController {

    static allowedMethods = [save: "POST", update: "POST", delete: "GET"]

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [produtoInstanceList: Produto.list(params), produtoInstanceTotal: Produto.count()]
    }

    def create() {
        [produtoInstance: new Produto(params)]
    }

    def save() {
        def produtoInstance = new Produto(params)
        if (!produtoInstance.save(flush: true)) {
            render(view: "create", model: [produtoInstance: produtoInstance])
            return
        }

        flash.message = message(code: 'default.created.message', args: [message(code: 'produto.label', default: 'Produto'), produtoInstance.id])
        redirect(action: "show", id: produtoInstance.id)
    }

    def show() {
        def produtoInstance = Produto.get(params.id)
        if (!produtoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'produto.label', default: 'Produto'), params.id])
            redirect(action: "list")
            return
        }

        [produtoInstance: produtoInstance]
    }

    def edit() {
        def produtoInstance = Produto.get(params.id)
        if (!produtoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'produto.label', default: 'Produto'), params.id])
            redirect(action: "list")
            return
        }

        [produtoInstance: produtoInstance]
    }

    def update() {
        def produtoInstance = Produto.get(params.id)
        if (!produtoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'produto.label', default: 'Produto'), params.id])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (produtoInstance.version > version) {
                produtoInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                    [message(code: 'produto.label', default: 'Produto')] as Object[],
                          "Another user has updated this Produto while you were editing")
                render(view: "edit", model: [produtoInstance: produtoInstance])
                return
            }
        }

        produtoInstance.properties = params

        if (!produtoInstance.save(flush: true)) {
            render(view: "edit", model: [produtoInstance: produtoInstance])
            return
        }

        flash.message = message(code: 'default.updated.message', args: [message(code: 'produto.label', default: 'Produto'), produtoInstance.id])
        redirect(action: "show", id: produtoInstance.id)
    }

    def delete() {
        def produtoInstance = Produto.get(params.id)
        if (!produtoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'produto.label', default: 'Produto'), params.id])
            redirect(action: "list")
            return
        }

        try {
            produtoInstance.delete(flush: true)
            flash.message = message(code: 'default.deleted.message', args: [message(code: 'produto.label', default: 'Produto'), params.id])
            redirect(action: "list")
        }
        catch (DataIntegrityViolationException e) {
            flash.message = "Produto não pode ser deletado porque está vinculado a uma venda"
            redirect(action: "list")
        }
    }
    
    def createVarios = {
        def listProdutos = []
        for (i in 1..params.codBarra.size()-1){
            if(params.codBarra[i]){
                def produto =  Produto.findByCodBarra(params.codBarra[i])
                if(produto){
                    listProdutos << produto
                }
                else{
                    String custo = ""
                    for(j in 8..4){
                        custo = custo + params.codBarra[i].substring(j-1,j)
                    }
                    def custoInt = Double.parseDouble(custo) /100
                    def produtoInstance = new Produto()
                    produtoInstance.codBarra = params.codBarra[i]
                    produtoInstance.categoria = ProdutoCategoria.findWhere(ref: params.codBarra[i].substring(0,1))              
                    produtoInstance.cor = ProdutoCor.findWhere(ref: params.codBarra[i].substring(1,2))              
                    produtoInstance.modelo = ProdutoModelo.findWhere(ref: params.codBarra[i].substring(2,3))              
                    produtoInstance.custoVirtual =  custoInt/3
                    produtoInstance.custoAtacado = custoInt 
                    produtoInstance.custoVarejo = custoInt * 1.5
                    produtoInstance.custoSugerido = (custoInt * 1.5)*2
                    produtoInstance.custoReal = 1
                    listProdutos << produtoInstance
                }
            }
        }
        [lst:listProdutos]
    }
    
    def salvarProdutos = {
        for(i in 1..<params.codBarra.size()){
            BigDecimal atacado = new BigDecimal( Double.parseDouble(params.custoAtacado[i]) )  
            BigDecimal virtual = new BigDecimal( Double.parseDouble(params.custoVirtual[i]) ) 
            BigDecimal varejo = new BigDecimal( Double.parseDouble(params.custoVarejo[i]) ) 
            BigDecimal sugerido = new BigDecimal( Double.parseDouble(params.custoSugerido[i]) )
            BigDecimal real = new BigDecimal( Double.parseDouble(params.custoReal[i]))
            
            def produtoCad =  Produto.findByCodBarra(params.codBarra[i])
            if(produtoCad){
                produtoCad.codBarra = params.codBarra[i]
                produtoCad.categoria = ProdutoCategoria.findWhere(nome: params.categoria[i])
                produtoCad.cor = ProdutoCor.findWhere(nome: params.cor[i])
                produtoCad.modelo = ProdutoModelo.findWhere(nome: params.modelo[i])
                produtoCad.fabricante = Fabricante.findAllById(params.fabricante[i])[0]
                produtoCad.estoqueQtd = Integer.parseInt(params.estoque[i])
                produtoCad.custoVirtual = virtual.setScale(2,BigDecimal.ROUND_HALF_UP)
                produtoCad.custoReal = real.setScale(2,BigDecimal.ROUND_HALF_UP)
                produtoCad.custoAtacado = atacado.setScale(2,BigDecimal.ROUND_HALF_UP)
                produtoCad.custoVarejo = varejo.setScale(2,BigDecimal.ROUND_HALF_UP)
                produtoCad.custoSugerido = sugerido.setScale(2,BigDecimal.ROUND_HALF_UP)
                produtoCad.save(flash:true)   
            }
            else{
                def produto = new Produto()           
                produto.codBarra = params.codBarra[i]
                produto.categoria = ProdutoCategoria.findWhere(nome: params.categoria[i])
                produto.cor = ProdutoCor.findWhere(nome: params.cor[i])
                produto.modelo = ProdutoModelo.findWhere(nome: params.modelo[i])
                produto.custoReal = real.setScale(2,BigDecimal.ROUND_HALF_UP)
                if(Fabricante.findAllById(params.fabricante[i])[0]){
                    produto.fabricante = Fabricante.findAllById(params.fabricante[i])[0]
                }
                if(params.estoque[i]){
                    produto.estoqueQtd = Integer.parseInt(params.estoque[i])
                }
                else{
                    produto.estoqueQtd = 0
                }
                produto.custoVirtual = virtual.setScale(2,BigDecimal.ROUND_HALF_UP)
                produto.custoAtacado = atacado.setScale(2,BigDecimal.ROUND_HALF_UP)
                produto.custoVarejo = varejo.setScale(2,BigDecimal.ROUND_HALF_UP)
                produto.custoSugerido = sugerido.setScale(2,BigDecimal.ROUND_HALF_UP)
                produto.vendaQtd = 0
                produto.save(flash:true)
            }
        }
        redirect (action:'list')
    }
    
    def filtroProduto() {
        String delims = "[ ]+";
        String[] tokens = params.filtroProduto.split(delims);
        def c = Produto.createCriteria()
        def results = c {
            tokens.each(){key ->
                or{                    
                    like("codBarra", "%${ key }%")
                    categoria{
                        like("nome", "%${ key }%")
                    }
                    cor {
                        like("nome", "%${ key }%")
                    }
                    modelo {
                        like("nome", "%${ key }%")
                    }
                }
            }
        }
        render(template:'list', model:[produtoInstanceList:results])
    }
    
    def prodConsultor(){}
    
    def transferencia(){}
    
    
    def conferencia(){
        println params.usuario.id
        for (i in 1..params.codBarra.size()-1){
            
        }
    }
}
